Глава
9
Переменные
и типы CFML
В предыдущих
главах мы уже сталкивались с применением переменных, а в данной главе рассмотрим
более подробно возможности использования переменных в ColdFusion. Но, для начала,
познакомимся с понятием типов данных и допустимыми типами данных в ColdFusion.
Тип —
это классификация, основанная на содержимом и индивидуальности. Тип определяет
свойства выражения или переменной таким образом, что вы можете предсказать ее
поведение.
В ColdFusion
существуют следующие основные типы данных:
Кроме того,
в ColdFusion доступны несколько более сложные типы:
Описание
типов данных приведено в табл. 9.1.
Таблица
9.1. Описание типов данных
Типы |
Описание |
||
Integer |
Целое число.
Может принимать значения от —2147483648 до |
||
|
2147483647 |
||
Real |
Числовые данные с плавающей точкой. Тип предназначен для хра- нения чисел.
Всякий раз, выполняя математические операции, вы имеете дело
с той или иной разновидностью числовых значений Диапазон чисел
ColdFusion— приблизительно от -1300 до 1300.
Макси- мальное число
цифр после запятой — 12. Например, 3,14159265359. ColdFusion поддерживает
представление чисел в экспоненциальной форме, например,
5Е10 |
||
String |
Символы. Текст,
заключенный в одинарные или двойные кавычки. |
||
|
Максимальная
длина ограничена количеством доступной памяти в |
||
|
ColdFusion Server |
||
Boolean |
Логический тип
— результат логического действия. Возможные зна- |
||
|
чения: True
(Истина) или False (Ложь). |
||
|
Числовой эквивалент
True— 1. Числовой эквивалент False— 0. |
||
|
Символьный эквивалент
True— "Yes". Символьный эквивалент |
||
|
False — "No" |
||
Date |
Дата и время.
Идентифицируют дату и время, где минимальное |
||
|
значение года
может быть 100, а максимальное — 9999. Если ника- |
||
|
кая часть времени
не определена, время устанавливается в |
||
|
12:00аm. |
||
|
Вы можете также
непосредственно задавать дату в любом из сле- |
||
|
дующих форматов: |
||
|
|
||
|
• "June
01, 1970" |
||
|
• "Jim
01, 1970" |
||
|
• "Jun.
01, 1970" |
||
|
• "06/01/70" |
||
|
• "1970-01-06" |
||
Time |
Вы можете непосредственно
задавать дату и время в любом из |
||
|
следующих форматов: |
||
|
• "June
01, 197002:34:12" |
||
|
• "June
01,19702:34a" |
||
|
• "June
01, 1970 2:34am" |
||
|
• "June
01,1 970 02:34am" |
||
|
• "June
01, 19702am" |
||
|
Точность — до
секунды |
||
Типы |
Описание |
||
List |
Списки — специальный
символьный тип, составленный из элемен- |
||
|
тов, отделенных
разделителями. Допускается самостоятельное оп- |
||
|
ределение разделителя,
который может состоять как из одного, так и из нескольких символов.
По умолчанию в качестве разделителя принимается запятая (,). Разделители
перед первым элементом и |
||
|
после последнего
элемента игнорируются. |
||
|
Структура списков
плоская, т. е. списки не могут быть вложены друг в друга. Также, списки
не могут содержать никакие "пустые" элементы. Однако список
может быть пуст, в этом случае он эквива- |
||
|
лентен пустому
значению — "" |
||
Structure |
Вы можете использовать
структуры, чтобы создавать и поддерживать пары ключевых значений,
обращаться к связанным символьным значениям как к общности, а не как
к индивидуальным значениям, или формировать ассоциативные массивы |
||
Array |
Массивы — это
группы переменных одного типа, доступ к которым осуществляется с помощью
общего имени. Хотя функция ArrayNew только |
||
|
поддерживает
создание массивов, до третьей размерности, массив не имеет предела
на свой размер или максимальное значение. |
||
|
Элементы записываются
в массив следующим образом: |
||
|
<CFSET MyNewArray
= ArrayNew (1)> |
||
|
<CFSET MyNewArray
[1] = "Anjuta"> |
||
Query |
В ColdFusion
запросы могут быть объявлены как объекты и назначены в качестве переменной
запроса: |
||
|
<CFQUERY
NAME=MyNewQuery |
||
|
DATASOURCE=Cruise |
||
|
SELECT * FROM
TICKET |
||
|
</CFQUERY> |
||
|
<CFSET MySecondQuery
= MyNewQuery> |
||
|
В данном случае
(в отличие от того же самого действия с массивами) запрос не скопирован.
Вместо этого обе переменные указывают на набор записей данных так,
что если вы производили изменения в таблице, упомянутой в запросе,
первоначальный запрос и |
||
|
запрос MySecondQuery
отразят эти изменения. |
||
|
Запросы и переменные
не могут одновременно иметь одинаковые имена в пределах одной Web-страницы |
||
Типы |
Описание |
||
COM object |
СОМ-объекты
— невмзуапьные компоненты, инкапсулирующие определенные функциональные
возможности. Примерами СОМ-объектов могут служить элементы ActiveX,
OCX, CORBA и ADO-объекты. СОМ-объекты
обычно содержат методы, подобно функциям, которые можно использовать,
чтобы выполнить некоторые действия: <CFSET objExcelChart
= objCharts . Add ( ) > СОМ-объекты
также обычно характеризуются свойствами. Вы можете считывать и записывать
свойства объектов, используя ColdFusion-переменные: <CFSET objExcelChart.
Туре = -4100> |
||
Переменная
— это один из элементов хранения информации. Переменные в CFML для хранения
данных размещаются в контейнерах, к которым можно обратиться по имени. Это позволяет
разрабатывать программы, содержащие переменные, с достаточно наглядным кодом,
т. к. вместо неструктурированных переменных программа использует имена, которые
разъясняют назначение данных.
Переменные
в ColdFusion имеют определенные области действия и назначение и по этим признакам
относятся к определенной категории. Эти категории, отражающие префикс, который
может быть добавлен к имени переменной, представлены в табл. 9.2.
Таблица
9.2. Описание областей действия переменных
Префикс |
Описание |
||
Local URL CGI Cookie Form. Request |
Локальные переменные,
создаются с помощью тегов <CFSET> ИЛИ <CFPARAM> Переменные,
отражающие параметры, добавленные к URL-адресу Переменные,
отражающие CGI-переменные окружения Переменные, отражающие cookies,
передаваемые браузеру Переменные,
отражающие значения полей формы, переданные в текущую страницу Переменные,
отражающие значения после обработки запросов на странице |
||
Префикс |
Описание |
||
Caller |
Переменные источников
вызова; предназначены для переменных из шаблонов при указании пользовательских
тегов ColdFusion |
||
Attributes |
Переменные атрибутов
пользовательских тегов |
||
Client |
Клиентские переменные |
||
Session |
Переменные сессий |
||
Application |
Переменные прикладных
задач |
||
Server |
Серверные переменные |
||
Имена переменных
должны начаться с буквы, которая может сопровождаться любым цифровым символом
или символом подчеркивания (_). Например, MyVariable_l и MyVariable_2, В ТО
время как строка IstMyVariable! не может быть использована в качестве имени
переменной.
Иногда имена
переменных могут начинаться с приставки (префикса), которая непосредственно
является отражением типа переменной. Приставка отделяется от имени переменной
точкой (.), например, Form.FirstName. В этом случае приставка Form показывает,
что переменная FirstName является полем формы, переданной в текущую Web-страницу.
К обязательным
префиксам относительно Attributes, Request, Session, Application,
Server и Caller (в случае использования пользовательских тегов).
При отсутствии
использования приставки в других переменных, ColdFusion совершает поиск значений
в следующем порядке:
В ColdFusion
для определения переменных существуют такие теги, как <CFSET> и <CFPARAM>.
Здесь мы приведем несколько примеров определения переменных с использованием
упомянутых тегов. Но обо всем по порядку.
Одним из
вариантов определения переменной в ColdFusion является указание тега <CFSET>.
Если переменная уже существует, она определяется повторно.
Синтаксис:
<CFSET имя_переменной
= выражение>
Например,
для определения переменной FirstName со значением "Anjuta" необходимо
включить в текущую Web-страницу следующий код:
<CFSET FirstName="Anjuta">
В следующем
примере создаем новый массив MyCruisesLine с перечислением круизов:
<CFSET MyCruisesLine
= ArrayNew(1)>
<CFSET MyCruisesLine[1]
= "1-hr Seaport Liberty">
<CFSET MyCruisesLine[2]
= "2-hr Semi Circle">
<CFSET MyCruisesLine[3]
= "3-hr Full Island">
<CFSET MyCruisesLine[4]
= "2-hr Harbor Lights Evening">
<CFSET MyCruisesLine[5]
= "Special Events">
И в заключение
данного раздела представим пример для работы с СОМ-объектом. Здесь мы
создаем СОМ-объект на основе приложения MS Excel с помощью тега <CFOBJECT>,
а используя тег <CFSET>, определяем свойства и методы этого объекта:
<CFOBJECT
ACTION="CREATE"
CLASS="Excel.Application"
NAME="objExcel"
TYPE="COM">
<CFSET objExcel.Visible = "False">
<CFSET objWorkBook = objExcel.Workbooks>
<CFSET objOpenedBook = objWorkBook.Add()>
<CFSET objWorkSheets = objExcel.WorkSheets>
<CFSET objWorkSheet = objWorkSheets.Add()>
<CFSET objRange = objExcel.Range("Al:A1")>
<CFSET objRange.value = "MyLineCruises">
<CFSET objWorkSheet.SaveAs("D:\Cruises.xls",Val(1))>
<CFSET objWorkBook.Close()>
<CFSET objExcel.Quit()>
<CFSET objExcel
= "Nothing">
В результате
данного примера из диапазона ячеек А1:А1, которому присваи-ваентся имя "MyLineCruises",
создается файл MS Excel и сохраняется в каталоге D:\ с именем Cruises.xls.
Еще одним
вариантом определения переменной в ColdFusion является использование тега <CFPARAM>,
который также обеспечивает возможность указания типа данных и значения по умолчанию,
в том числе может применяться для проверки существования переменной.
Синтаксис:
<CFPARAM
NAME = "variable_name" TYPE = "data_type" DEFAULT = "default_value">
Имеются два
способа использования тега <CFPARAM>, в зависимости от задачи:
Следующий
пример показывает, как использовать тег <CFPARAM> для определения переменной,
если она отсутствует:
<CFPARAM
NAME="Form.Gender" DEFAULT="male">
Отметим также возможные варианты необязательного атрибута TYPE:
Например, определим переменную Moneyness с типом boolean:
<CFPARAM
NAME="Moneyness" DEFAULT=True TYPE="boolean">
По умолчанию
тип данных переменной принимает значение any.
CGI (Common
Gateway Interface, стандартный интерфейс шлюза) является стандартом интерфейса
связи внешней прикладной программы с информационным сервером типа HTTP или Web.
В ColdFusion существует набор стандартных CGl-переменных окружения версии 1.1,
которые можно использовать для диагностики запросов (request), сервера (server),
посылающего запросы, и клиента (client), принимающего эти запросы. Описание
переменных приведено в табл. 9.3—9.5.
Таблица
9.3. CGI-переменные запросов
Наименование |
Описание |
||
CGI . CONTENT
LENGTH |
Длина в байтах
тела запроса |
||
CGI. CONTENT
TYPE |
Тип тела запроса |
||
CGI . PATH INFO |
Дополнительная
информация о пути, которую пере- |
||
|
дал клиент |
||
CGI . PATH_TRANSLATED |
Сервер передает
преобразованную версию PATH INFO, которая включает в себя путь, преобразованный
из виртуального в физический |
||
CGI. QUERY STRING |
Строка запроса.
Принимает значение при использовании метода GET и подобного |
||
CGI.HTTP_REFERER |
Ссылка на страницу
при выполнении запроса. Принимает значение при использовании метода
GET и подобного |
||
CGI. REQUEST
METHOD |
Метод, который
был использован для запроса. Для HTTP ЭТО GET,
POST, HEAD И Т. Д. |
||
CGI. SCRIPT
NAME |
Виртуальный
путь к шлюзу текущего запроса |
||
Таблица
9.4. CGI-переменные диагностики сервера
Наименование |
Описание |
||
CGI.AUTH TYPE CGI. GATEWAY
INTERFACE CGI. REMOTE ADDR |
Эта переменная
определена в том случае, когда запрошенный ресурс требует аутентификации
пользователя Версия CGI-спецификации IP-адрес удаленного
хоста, производящего данный запрос |
||
Наименование |
Описание |
||
CGI . REMOTE_HOST
CGI.REMOTEJJSER REMOTE I DENT CGI . SERVER
NAME CGI . SERVER PORT CGI . SERVER
PROTOCOL CGI . SERVER_SOFTWAR'E |
Имя удаленного
хоста, производящего запрос. Если сервер не имеет такой информации,
он должен задать REMOTE ADDR, а это поле оставить не установленным Переменная определена
в том случае, когда запрошенный ресурс требует аутентификации пользователя Если HTTP-сервер
поддерживает идентификацию пользователя согласно RFC 931 , то переменная
будет содержать имя пользователя, полученное от сервера Имя хоста, на
котором запущен сервер, DNS-имя или IP-адрес в том виде, в котором
он представлен в URL Номер порта,
через который был послан запрос. По умолчанию HTTP-порт 80 Имя и версия
информационного протокола Название и версия
информационного сервера, который отвечает на запрос и запускает шлюз |
||
Таблица
9.5. CGI-переменные диагностики клиента
Наименование |
Описание |
||
CGI.CERT_ISSUER |
Издатель сертификата |
||
CGI. CLIENT
CERT ENCODED |
Полная информация
о сертификате клиента в закодированном виде (Base-64 encoded) |
||
CGI.CERT_SUBJECT |
Субъект издательского
сертификата |
||
CGI. HTTP ACCEPT |
Список MIME-типов,
которые клиент может обработать, как задано в HTTP-заголовках |
||
CGI. HTTP IF_MODIFIED
SINCE |
Переменная предоставляет
возможность эффективного обновления информации локальных кэшей с минимумом
передаваемой информации |
||
CGI. HTTP USER
AGENT |
Информация о
браузере, который использует клиент для посылки запроса |
||
В следующем
примере с помощью CGI-переменной HTTP_USER_AGENT мы распознаем тип браузера,
и если этот браузер является встроенным в мобильный телефон, который поддерживает
технологию WAP, тогда формируем соответствующий код, используя язык WML. В противном
случае загружаем
Web-страницу idx.cfm с кодом, "читаемым" обычными компьютерными браузерами:
<CFIF CGI.HTTP_USER_AGENT
contains "wap"> <CFCONTENT TYPE="text/vnd.wap.wml">
<?xml version="1.0"?>
<!DOCTYPE
wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforuin.org/DTD/wml_l.l.xml">
<wml>
<card id="start"
ontimer="idx.wml">
<timer value="l"/>
<p align="center"ximg
src="logo.wbrup" alt="Welcome!"/>
<br/xi>One
moment ...</i> </p> </card> </wml>
<CFELSE>
<META HTTP-EQUIV="Refresh"
CONTENT="0;URL=idx.cfm"> </CFIF>
К этому примеру
мы еще вернемся в главе 21.
Клиентские
переменные могут использоваться в таких целях, как сохранение параметров, характеризующих
шрифт, цвет, стиль и расположение страницы, а также хранение значения счетчика
и последнего времени посещения страницы, в конце концов, контроль результатов
опросов, тестов, закупок в электронных магазинах и т. д.
В ColdFusion
существует три возможных механизма хранения клиентских переменных.
Рис.
9.1. Установка жизненного цикла клиентской переменной для механизма
хранения в реестре
За выбор механизма хранения клиентских переменных отвечает атрибут CLIENTSTORAGE тега <CFAPPLICATION>.
Атрибут CLIENTMANAGEMENT
того же тега позволяет
включать или отключать управление клиентскими переменными.
В следующем примере с помощью тега <CFPARAM> создадим клиентскую переменную Client.NameCruise CO значением по умолчанию "1-hr Seaport Liberty":
<CFPARAM
NAME="Client.NameCruise" DEFAULT="1-hr Seaport Liberty">
Если учесть,
что в нашем случае механизм хранения переменных не изменялся и принимает значение
по умолчанию — Registry (Реестр), то и переменную следует искать в системном
реестре. На рис. 9.2 показано окно Registry Editor (Редактор реестра)
после выполнения примера создания клиентской переменной Client.NameCruise.
Как вы заметили,
жизненный цикл клиентских переменных достаточно длительный, так что при необходимости
принудительного удаления клиентской переменной можно воспользоваться функцией
DeieteClientvariabie следующим образом:
<CFSET IsDeleteSuccessful=DeleteClientVariable("NameCruise")>
IsDeleteSuccessful
= <CFOUTPUT>#IsDeleteSuccessful#</CFOUTPUT>
Рис.
9.2. Окно редактора реестра Registry Editor
В представленном
примере первая строка кода позволяет удалить переменную NameCruise, а вторая
строка отражает результат переменной IsDeleteSuccessful, где значение "Yes"
указывает на удачное удаление переменной.
можно , кпримеру,
воспользовавшись функцией GetClientVariablesList, отразить список клиентских
переменных:
<CFOUTPUT>#GetClientVariablesList()#</CFOUTPUT>
В ColdFusion
существуют встроенные клиентские переменные, приведенные в табл. 9.6.
Таблица
9.8. Встроенные клиентские переменные
Наименование |
Описание |
||
Client . CFID |
Идентификатор
для каждого клиента, который соединяется с сервером |
||
Наименование |
Описание |
||
Client .CFTOKEN
Client . URLToken
Client .LastVisit Client. HitCount
Client . TimeCreated |
Произвольно
сгенерированный номер, являющийся уникальным идентификатором конкретного
клиента Комбинация значений
CFID и CFTOKEN, разделенных символом & с указанием наименования
переменных Дата и время
последнего посещения, сделанного клиентом Количество запросов,
выполненных к странице клиентом, идентифицированным под значениями
переменных CFID И CFTOKEN Записывает дату
и время, когда переменные CFID и CFTOKEN были созданы для данного
клиента |
||
Работа со
встроенными клиентскими переменными возможна при включении атрибута CLIEJSITMANAGEMENT
тега <CFAPPLICATION>. Для этого достаточно в конфигурационном файле приложения
Application.cfm записать следующий код:
<CFAPPLICATION
NAME="MyLineCruises"
ClIENTMANAGMENT="Yes">
Более подробно
использование механизма хранения переменных с помощью базы данных и конфигурационного
файла Application.cfm рассмотрим в главе 10.
Переменные
сессии служат для единовременного фиксирования посещения Web-страницы. Сессия
определяется индивидуальным пользователем, в результате чего каждый пользователь
имеет отдельную сессию и конкретный набор переменных сессии. Сессия начинается
при первом вхождении на Web-участок и формально заканчивается при завершении
работы браузера. Таким образом, один пользователь может работать сразу с несколькими
сессиями, предварительно запустив браузер необходимое количество раз. Мы говорим
о формальном завершении сессии, т. к. сессия имеет период времени, по окончании
которого при бездействии пользователя сессия завершается, а, следовательно,
и жизненный цикл переменных прекращается. То есть зарегистрировались вы на одном
из Web-участков, некоторое время поработали и, не закрывая ваш любимый браузер,
отлучились от компьютера, например, ушли на обед. А через определенный промежуток
времени сессия завершается. Приходите с обеда, пытаетесь совершить какие-либо
действия в окне открытого браузера, но ничего не получается. Все дело в том,
что переменные сессии,
часть из которых могли отвечать за доступ к Web-участку, прекратили свое существование.
Переменные
сессий могут использоваться в таких целях, как хранение параметров регистрации
пользователя, хранение вычислений, основанных на информации из клиентских переменных,
хранение временных результатов запросов к данным, в общем, контроль над всеми
переменными, требующими сохранение только в течение единой сессии.
В ColdFusion
жизненный цикл переменных сессий по умолчанию равен 20 минутам. Однако так же,
как и с клиентскими переменными, имея доступ к Web-странице "ColdFusion
Administrator", данное значение можно изменить (рис. 9.3).
Рис.
9.3. Страница "ColdFusion Administrator", раздел Memory
Variables
Более того,
данный период можно указать программным методом, все в том же пока мало известном
конфигурационном файле приложения Application, cfm, используя атрибут SESSIONTIMEOUT
все того же тега <CFAPPLICATION>.
Скажем, для
указания периода жизни переменных сессий, равным 25 минутам, и включения управления
этими переменными следует в конфигурационном файле приложения Application.cfm
записать следующий код:
<CFAPPLICATION
NAME="MyLineCruises"
SESSIONTIMEOUT="#createTimeSpan(0,0,25,
0)1" SESSIONMANAGEMENT="Yes">
Для примера
объявим переменную сессии Login следующим образом:
<CFSET Session.Login
= "true">
Надо отметить,
что принудительное удаление той или иной переменной сессии возможно при вызове
функций structDelete или structciear. Таким образом, осуществить удаление переменной
Login можно следующим образом:
<CFLOCK TIMEOUT="30" SCOPE="Session" TYPE="Exclusive">
<CFSET StructDelete(Session, "Login")>
<CFIF IsDefined("Session.Login")>
Variable still
exists. <CFELSE>
Variable is
successfully removed! </CFIF> </CFLOCK>
В приведенном
примере мы использовали блокировку посредством тега <CFLOCK>, что является
правилом хорошего тона при работе в сети. Более подробно применение блокировок
рассмотрим в главе 10.
В ColdFusion
существуют встроенные переменные сессий, перечень которых приведен в табл. 9.7.
Таблица
9.7. Встроенные переменные сессий
Наименование |
Описание |
||
Session. CFID
Session. CFTOKEN Session. URLToken
Session. SessionID |
Идентификатор
для каждого клиента, который соединяется с сервером Произвольно
сгенерированный номер, являющийся уникальным идентификатором конкретного
клиента Комбинация значений
переменных CFID и CFTOKEN, разделенных символом & с указанием
наименования переменных Идентификатор
сессии, представляющий комбинацию значений наименования приложения
CFID и CFTOKEN, разделенных символом подчеркивания ( ) |
||
Работа со
встроенными переменными сессий возможна при включении атрибута SESSIONMANAGEMENT
тега <CFAPPLICATION>.
Переменные
сессий хранятся в оперативной памяти сервера.
Переменные
прикладных задач (далее будем называть их прикладными переменными) связаны с
единым приложением и доступны всем клиентам данного приложения. Прикладные переменные
могут использоваться в таких целях, как хранение учета обращений к текущему
приложению, хранение результатов запросов к данным, к которым могут обращаться
все клиенты приложения, хранение наименований источников данных, а также хранение
заголовка приложения и стандартных сообщений и т. д.
Для использования
прикладных переменных необходимо создать конфигурационный файл с именем Application.cfm
и добавить туда определение имени приложения, используя атрибут NAME тега <CFAPPLICATION>.
Указанные определения в конфигурационном файле приложения распространяются на
все прилегающие к этому файлу страницы приложения. То есть, загружая ту или
иную страницу ColdFusion, система ищет файл Application.cfm вплоть до корневого
каталога приложения и при первой удачной попытке содержимое найденного файла
помещается в начало загруженной ColdFusion-страницы.
В ColdFusion
жизненный цикл прикладных переменных по умолчанию равен 2-м дням. Однако, имея
доступ к Web-странице "ColdFusion Administrator", данное значение
можно изменить. И так же, как и с переменными сессий, период жизненного цикла
можно указать программным методом, в конфигурационном файле приложения Application.cfm,
используя атрибут APPLICATIONTIMEOUT
тега <CFAPPLICATION>.
Например,
для указания периода жизни прикладных переменных равным 4-м часам следует в
конфигурационном файле приложения Application.cfm записать следующий код:
<CFAPPLICATION
NAME="MyLineCruises"
APPLICATIONTIMEOUT="#createTimeSpan(0,4,0,
0)#" SESSIONMANAGEMENT="Yes">
Для примера
объявляем прикладную переменную textFieidsize следующим образом:
<CFPARAM
NAME="Application.textFieldSize" DEFAULT="25">
Следующий
пример позволяет вывести список прикладных переменных с использованием тега
<CFLOOP>, определив эти переменные в качестве коллекции:
<CFLOCK TIMEOUT="30" SCOPE="Application" TYPE="ReadOnly">
<CFLOOP COLLECTION=#Application#
ITEM=itemID>
<CFOUTPUT>ID=#itemID#
Value=#Application[itemID]#</CFOUTPUT><br>
</CFLOOP>
</CFLOCK>
В" этом
примере мы использовали блокировку прикладных переменных только на чтение.
Удаление
переменных прикладных задач производится по аналогии с удалением переменных
сессий. К примеру, для удаления ранее объявленной переменной textFieidSize можно
использовать следующую конструкцию:
<CFLOCK TIMEOUT="30"
SCOPE="Application" TYPE="Exclusive">
<CFSET StructDelete(Application,
"textFieidSize")> </CFLOCK>
В качестве
встроенных прикладных переменных в ColdFusion существует переменная Application.AppiicationName,
принимающая значение атрибута NAME тега <CFAPPLICATION>, объявленного
в конфигурационном файле Application.cfm.
Серверные
переменные не привязаны к какому-либо приложению (application) или клиенту,
а относятся непосредственно к ColdFusion Server, и по этой причине к ним можно
обращаться всем клиентам или из разных приложений данного сервера. Эти переменные
хранятся в оперативной памяти сервера до тех пор, пока тот не будет приостановлен.
Например,
объявим серверную переменную CountuserActive с использованием тега <CFSET>:
<CFSET Server.CountuserActive
= 0>
Удаление
и просмотр серверных переменных осуществляется по аналогии с переменными сессий
и переменными прикладных задач. Скажем, удаление серверной переменной CountuserActive
можно осуществить следующим способом:
<CFLOCK TIMEOUT="30"
SCOPE="Server" TYPE="Exclusive">
<CFSET StructDelete(Server,
"CountuserActive")> </CFLOCK>
В ColdFusion
существуют встроенные серверные переменные, приведенные в табл. 9.8.
Таблица
9.8. Встроенные серверные переменные
Наименование |
Описание |
||
Server . ColdFusion . ProductName | Название продукта ColdFusion Server | ||
Server. ColdFus ion. ProductVers ion | Номер версии запущенного сервера, типа 5.0.0 | ||
Server . ColdFusion
. ProductLevel |
Уровень продукта,
например Enterprise |
||
Server . ColdFusion
. SerialNumber |
Последовательный
номер, назначенный |
||
|
при установке |
||
Server . ColdFusion
. Locales |
Язык и регион
поддерживаемый серве- |
||
|
ром, например,
English (US) |
||
Server .OS.
Name |
Название операционной
системы, например Windows NT |
||
Server . OS
. Addit ional Information |
Дополнительная
информация, обеспеченная операционной системой. Например, номер Service
Pack |
||
Server. OS .Version |
Версия операционной
системы, например 4.0 |
||
Server . OS
. BuildNumber |
Номер сборки,
определенный операционной системой, типа 1381 |
||
Используйте
серверные неременные, когда хотите организовать доступ к данной переменной из
любого другого клиентского соединения вашего сервера. Не храните слишком большое
количество серверных переменных.
В табл. 9.9
приведем сравнение переменных по различным характеристикам.
Таблица
9.9. Сравнение переменных
Тип переменной |
Возможность
блокировки |
Способ хранения |
Период жизненного
цикла, по умолчанию |
||
Client |
Нет |
Registry (Реестр)
Cookie (Ячейка) Data Source (Источник данных) |
10 дней 90 дней |
||
Session |
Да |
ОЗУ сервера |
20 минут |
||
Application |
Да |
ОЗУ сервера |
2 дня |
||
Server |
Да |
ОЗУ сервера |
До завершения
работы |
||
|
|
|
сервера |
||
В процессе
разработки приложений достаточно часто необходимо просматривать значения объявленных
переменных, и если для формирования CFML-страниц вы не используете редактор
ColdFusion Studio, позволяющий отлаживать страницы посредством встроенного механизма,
то для этих целей
можно использовать программный метод просмотра существующих переменных.
Для отладки
переменных можно применять тег <CFDUMP>, позволяющий наглядно демонстрировать
значения простых переменных, запросов, массивов, структур и WDDX-переменных,
созданных с помощью тега <CFWDDX>.
К примеру,
вспомним код страницы my_line.cfm, детально описанной в главе 7 (см.
листинг 7.1). Поместим в него следующую строку:
<CFDUMP var="#Cookie#">
Этим мы определим необходимость проверки всех существующих на странице ячеек (cookie).
Следующий
пример позволяет создать список HTTP-заголовков для просмотра ИХ значений, используя
функцию GetHttpRequestData() .
Листинг
9.1. Код страницы GetHttpRD.cfm
<HTML>
<HEAD>
<TITLE>GetHttpRequestData</TITLE>
<LINK rel="STYLESHEET" type="text/css" href="my__style.css">
</HEAD>
<BODY>
<CFSET HttpRData
= GetHttpRequestData()> <CFOUTPUT>
<TABLE bgcolor="ElE1El"
cellpadding = "0" cellspacing = "0"> <TR>
<TD bgcolor="666699"
align="center" class="clTitle">
Name HTTP-Request</TD>
<TD bgcolor="666699"
align="center" class="clTitle">
Value</TD>
</TR>
<CFLOOP COLLECTION
= #HttpRData.headers! ITEM = "http_name"> <TR>
<TD class="clText">#http_name#</td>
<TD class="clText">#StructFind(HttpRData.headers,
http_name)#</td>
</TR>
</CFLOOP>
</TABLE> </CFOUTPUT>
</BODY>
</HTML>
Отметим
лишь то, что в данном примере для функции GetHttpRequestData () мы использовали
вхождение headers, что, собственно говоря, и позволило нам отфильтровать переменные
HTTP-заголовков. Также эта функция предоставляет возможность использования вхождений
content, method и protocol.
Одним из
главных правил при работе с переменными является то, что прежде чем совершить
какие-либо действия по отношению к той или иной переменной, необходимо произвести
проверку наличия таковой. Мы уже не раз приводили примеры с использованием функции
isDefined, позволяющей придерживаться данного правила. И все же еще раз обратим
ваше внимание на пример, обеспечивающий проведение проверки в данном случае
переменной Session.Login:
<CFIF IsDefined("Session.Login")>
Variable is
present. <CFELSE>
Variable is
absent. </CFIF>
Всегда ли
мы уверены, что над переменной можно произвести ряд действий, требующих представления
этой переменной в формате даты. Конечно же, нет. К примеру, вы предоставляете
пользователю форму для ввода данных о себе с последующим занесением результата
заполнения в базу данных, где одним из полей является день рождения. И далеко
не всегда пользователь в состоянии с первого раза правильно заполнить данное
поле, причем по разным причинам. Выходов из этого положения может быть несколько:
контроль над полем на уровне JavaScript, размещение на форме ввода специальных
инструментов типа "spinner", контролирующих ввод данных. Однако мы
будем использовать возможности ColdFusion.
В следующем
примере объявим переменную Form.BirtDayMyMam и тем самым подменим процесс ввода
этой переменной. И уже на второй строке кода с помощью функции isDate проверим,
можно ли преобразовать эту переменную, используя одну из функций по работе с
датами (в нашем случае функция форматирования Даты — DateFormat):
<CFSET Form.BirthDayMyMam = "4-19-1940">
<CFIF IsDate(Form.BirthDayMyMam)>
<CFOUTPUT>
#DateFormat(Form.BirthDayMyMam,
"mmm-dd-yyyy")#
</CFOUTPUT>
<CFELSE>
Return on the
form of input
</CFIF>
Результатом
данного примера является следующая строка:
Арr-19-1940
Вот еще один
похожий пример, только уже позволяющий проверить в данном случае переменную
Form.CostAduits на наличие числового формата. Здесь мы также подменяем процесс
ввода на объявление переменной с использованием тега <CFSET>:
<CFSET Form.CostAduits = "17.9">
<CFIF IsNumeric(Form.CostAdults)>
<CFOUTPUT>
iNumberFormat(Form.CostAduits,
'$___.__')#
</CFOUTPUT>
<CFELSE>
Return on the
form of input </CFIF>
В приведенном
выше примере используется функция NumberFormat с необязательным параметром маски
(mask), позволяющая форматировать числовые значения. И результатом этого примера
является строка:
$ 17.90
Очередной
пример позволяет нам определить, можно ли полученную переменную привести к логическому
формату данных. И здесь мы воспользовались тегом <CFSET> для подмены процесса
ввода переменной Form.MyYesNo:
<CFSET Form.MyYesNo = 1>
<CFIF IsBoolean(Form.MyYesNo)>
<CFOUTPUT>
#YesNoFormat(Form.MyYesNo)#
</CFOUTPUT>
<CFELSE>
Return on the
form of input </CFIF>
В приведенном
выше примере используется функция YesNoFormat, позволяющая преобразовывать логическое
значение или число к виду Yes или NO. Результатом этого примера является строка:
Yes
Следует отметить,
что параметр функции isBooiean может быть как в виде числового, так и в виде
символьного значения в отличие от предыдущих функций IsDate и isNumeric, где
в качестве параметра должны присутствовать символьные значения. При значении
параметра, равным нулю, False или
NO функция IsBooiean возвращает False, в противном случае возвращается True.
В заключение
представим полный код страницы signup.cfm, предназначенной для регистрации пользователя
с применением вышеописанных функций, позволяющих контролировать ввод данных
на уровне ColdFusion.
Листинг
9.2. Код страницы signup.cfm
<HTML>
<HEAD>
<МЕТА name= "Author" content= "Ruben Akhayan">
<TITLE>Sing up</TITLE> <style type="text/css">
<! — .txt
{
padding : Opx; font-weight : normal; font-family : Verdana, Geneva, Arial;
font-size : llpx;
color : White; }
.txtError {
padding : Opx; font-weight : normal; font-family : Verdana, Geneva, Arial; font-size
: llpx; color : IFFCOCB; } INPUT {
padding : 0px;
font-weight
: normal;
font-family
: Verdana, Geneva, Arial;
font-size :
llpx;
color : Blue;
}
.note {
color : #F5FFFA;
}
</style>
</HEAD>
<BODY bgcolor="<cfoutput>#application.BGColorPage#</cfoutput>">
<GFIF isDefined("Form.login_use")>
<CFSET DIsuccessful = 1>
<CFSET msgError
= "Warning Error!">
<CFIF Len(Form.login_use)
le 5>
<CFSET msgError
= msgError &
"<br>Login
should consist from more than 5 symbols">
<CFSET DIsuccessful = 0> </CFIF>
<CFIF Len(Form.pass_use)
le 4>
<CFSET msgError
= msgError &
"<br>Password
should consist from more than 4 symbols">
<CFSET DIsuccessful = 0> </CFIF>
<CFIF IsNumeric(Form.pass_use)>
<CFSET msgError
= msgError &
"<br>Password
should not consist only of numbers">
<CFSET DIsuccessful = 0> </CFIF>
<CFIF Form.pass_use
not equal Form.confirm>
<CFSET msgError
= msgError &
"<br>Password and Confirm, should be identical">
<CFSET DIsuccessful
= 0> </CFIF>
<CFIF Len(Form.fname_use) le 0>
<CFSET msgError
= msgError &
"<br>First Name, should not be empty">
<CFSET DIsuccessful
= 0> </CFIF>
<CFIF Len(Form.lname_use) le 0>
<CFSET msgError
= msgError &
"<br>Last
Name, should not be empty">
<CFSET DIsuccessful = 0> </CFIF>
<CFIF not
IsDate(Form.bday use)>
<CFSET msgError
= msgError &
"<br>Birthday,
should have a format dd-mm-yyyy">
<CFSET DIsuccessful = 0> </CFIF>
<CFIF YesNoFormat(DIsuccessful)
equal "No">
<CFSET login
= IForm.login_use#>
<CFSET fname = fForm.fname_use#>
<CFSET Iname = ttForm.lname_use#>
<CFSET bday = #Form.bday_use#>
<CFSET email = IForm.email_use#>
<CFELSE>
<CFSET msgError=""> </CFIF>
<CFELSE>
<CFSET login=""> <CFSET fname="">
<CFSET lname=""> <CFSET bday="">
<CCFSET email=""> <CFSET msgError="">
<CFSET DIsuccessful
= 0> </CFIF>
<CFIF YesNoFormat(DIsuccessful) equal "Yes">
<CFOUTPUT>
<p class="txt">
Data input successful<br>
Hi dear iForm.fname_usel #Form.lname_usei
</p>
</CFOUTPUT>
<CFELSE>
<FONT color="White"><h2>Sign up</h2></font>
<FORM action='signup.cfm' METHOD='POST' name='forml' >
<TABLE border='0' cellspacing='5' cellpadding='0'>
<TR> <TD
colspan="2" align="center" class="txtError">
<CFOUTPUT>|msgError#</CFOOTPUT></TD></TR>
<TR><TD width='100' align="right" class="txt"> Login</td>
<td class="note">
<input name='login_use' size='17'
value="<CFOUTPUT>#login#</CFOUTPUT>"> *</TD></TR>
<TR><TD align="right" class="txt"> Password</td>
<td class="note">
<input type='password'
name='pass use'
size=' 17 ' > *</TD></TR>
<TR><TD align="right" class="txt"> Confirm</td><td class="note">
<input type='password'
name='confirm'
size=' 17 ' > *</TD></TR>
<TR><TD
align-"right" class="txt">
First Name</tdxtd
class="note"> <input name='fname use' size='17'
value="<CFOUTPUT>#fnam#</CFOUTPUT>"> *</TD></TR>
<TR><TD align="right" class="txt"> Last Name</td><td class="note">
<input name='lname_use'
size='17'
value="<CFOUTPUT>#lname#</CFOUTPUT>"> *</TD></TR>
<TR><TD align="right" class="txt"> Birthday</td>
<td class="note">
<input name='bday_use' size='10'
value="<CFOUTPUT>#bday</CFOUTPUT>">Snbsp;
dd-mra-yyyy *</TD></TR>
<TR><TD align="right" class="txt"> E-maiK/TD><TD class="note">
<input name='email_use'
size='27'
value="<CFOUTPUT>#email#</CFOUTPUT>"></TD></TR>
<TR><TD
align="right">
<input type=' submit' value='Send'></TD><TD>
<input type='reset' value='Clear' ></TD></TR>
</TABLE> </FORM> </CFIF>
</BODY>
</HTML>
В приведенном
выше примере мы использовали еще одну функцию — Len, позволяющую определить
количество символов указанной переменной в качестве параметра. Что же касается
занесения результатов регистрации в базу данных, то об этом поговорим в одной
из следующих глав.
Подведем
итог. В данной главе использовались: